package vip.liux.backend.application.service.pay;

import vip.liux.application.dots.ListResultDto;
import vip.liux.application.dots.PagedResultDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundCreateDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundDetailsDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundPageItemDto;
import vip.liux.backend.application.service.pay.dto.refund.PayRefundQueryDto;
import vip.liux.contracts.infrastructure.pay.dto.refund.ClientPayRefundDto;

/**
 * 退款订单 Service 接口
 *
 * @author aquan
 */
public interface PayRefundService {

    /**
     * 获得退款订单
     *
     * @param id 编号
     * @return 退款订单
     */
    PayRefundDetailsDto getRefund(Long id);

    /**
     * 获得退款订单
     *
     * @param refundNo 外部退款单号
     * @return 退款订单
     */
    PayRefundDetailsDto getRefundByRefundNo(String refundNo);

    /**
     * 获得指定应用的退款数量
     *
     * @param appId 应用编号
     * @return 退款数量
     */
    Long getRefundCountByAppId(Long appId);

    /**
     * 获得退款订单分页
     *
     * @param PageDto 分页查询
     * @return 退款订单分页
     */
    PagedResultDto<PayRefundPageItemDto> getRefundPage(PayRefundQueryDto PageDto);

    /**
     * 获得退款订单列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 退款订单列表
     */
    ListResultDto<PayRefundPageItemDto> getRefundList(PayRefundQueryDto exportReqVO);

    /**
     * 创建退款申请
     *
     * @param input 退款申请信息
     * @return 退款单号
     */
    String createRefund(PayRefundCreateDto input);

    /**
     * 渠道的退款通知
     *
     * @param channelId 渠道编号
     * @param notify    通知
     */
    void notifyRefund(Long channelId, ClientPayRefundDto notify);

    /**
     * 同步渠道退款的退款状态
     *
     * @return 同步到状态的退款数量，包括退款成功、退款失败
     */
    int syncRefund();

}
